Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №9
З дисципліни: «Засоби системного програмування»
На тему: «Використання макрокоманд та процедур.
Ввід даних з клавіатури та вивід результату на екран.»
ЗАВДАННЯ:
1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу над даними, введеними в десятковій системі і результат виводить на екран в десятковій формі.
Програма повинна складатися з трьох основних підпрограм:
процедура вводу - забезпечує ввід даних з клавіатури в десятковій формі і їх перевід у двійкове значення ;
процедура безпосередніх обчислень – здійснює всі необхідні арифметичні дії у двійковій системі;
процедура виводу – забезпечує перевід війкового результату у десятковий формат та вивід на екран.
Передача параметрів може здійснюватися довільним чином. Кожна з перерахованих процедур може містити довільну кількість додаткових підпрограм.
Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу. К – константа, довжина якої визначається значенням(згідно варіанту).
2. Переконатися у правильності роботи кожної процедури зокрема та програми загалом.
3. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
4. Дати відповідь на контрольні запитання.
№
Вираз
K
7
X=A4/B2-C1*(D1+E2-K)
717
Лістинг програми:
DOSSEG
.MODEL SMALL
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
.STACK 100h
.DATA
K EQU 29h
A db 0h
B dw 0h
C dw 0h
D dw 0h
E db 0h
Temp1 dw 00h,00h
Temp2 dw 00h,00h
Temp3 dw 00h
Temp4 dw 00h
Temp5 dw 00h,00h
X dw 00h,00h
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
X_div2 dw 0,0
Y_div2 dw 0
MESSG_X DB 13,10,'X=A1*B2-A1*C2+D2/(E1+K) K=41 (29h)','$'
MESSG_A DB 13,10,'A = ','$'
MESSG_B DB 13,10,'B = ','$'
MESSG_C DB 13,10,'C = ','$'
MESSG_D DB 13,10,'D = ','$'
MESSG_E DB 13,10,'E = ','$'
MESSG_X1 DB 13,10,'X = ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
minus db '-$'
Mult10 dw 1,0
my_z dw 0,0
Bool dw,0
.CODE
mov ax,@data
mov ds,ax
call input
call calculation
call output
mov ah,01
int 21h
mov ah,4Ch
int 21h
input proc
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_A
MOV AH,09
INT 21H
mov di,offset A
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_C
MOV AH,09
INT 21H
mov di,offset C
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_E
MOV AH,09
INT 21H
mov di,offset E
mov MaxLen,3
mov cx,MaxLen
call input_variable
ret
input endp
calculation proc
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
mov al,A
cbw
imul B
mov Temp1+2,dx
mov Temp1,ax
;temp1 <- ax (A1*B2) /* FF FF FF F4 */
mov al,A
cbw
imul C
mov Temp2+2,dx
mov Temp2,ax
;temp2 <- ax (A1*C2) /* 06 00 00 00*/
mov al,E
cbw
add ax,K
mov Temp3,ax
;temp3 <- ax (E1+K1) /* 2A 00*/
mov ax,D
cwd
idiv Temp3
mov Temp4,ax
;Temp4 <- (D/Temp3) /* FF FF */
mov ax,Temp1
sub ax,Temp2
mov Temp5,ax
mov ax,Temp1+2
sbb ax,Temp2+2
mov Temp5+2,ax
;Temp5 <- Temp1-Temp2 /* EE FF FF FF*/
mov ax,Temp5
add ax,Temp4
mov x,ax
mov ax,Temp4
cwd
adc Dx,Temp5+2
mov x+2,dx
;x <- Temp5+Temp4...